// 数字
let num: number = 123;

// 字符串
let str: string = "字符";

// 布尔
let isLoading: boolean = false;

// 数组
let arr: number[] = [1, 2, 1];
let strings: Array<string> = ['a', 'b', 'c']

// 联合类型
let timer: number | null = null
let arr1: (number | string)[] = [1, 2, 'xx']


// 自定义类型(类型别名) 
type ArrType = (number | string)[];
let arr2: ArrType = [1, 2, 'xx']
// 等价于 let arr2: (number | string)[] = [1, 2, 'xx']


//  函数

function printFun(txt: string) {
  console.log('params:', txt)
}

// 箭头函数
const fn1 = (a: number, b: number): number => {
  return a * b
}

//  void 类型  没有返回值
const con = function (str: string): void {
  console.log(str);
}

// 可选参数  必选参数不能在可选参数后面

// const print1 = function (a: string, b: string) {
//   console.log(a,b);
// }
// print1('a') // 报错

const print1 = function (a: string, b?: string) {
  console.log(a, b);
}
print1('a', 'b')  // 正常
print1('a') // 正常



// 对象类型 

let info = {
  name: '张三',
  age: 21,
  weight: 80,
  height: 160
}
// 使用类型别名 定义对象
type stu = {
  name: string,
  age: number,
  weight: number,
  height: number,
  address?: string  // 可选属性
}

let zhang: stu = {
  name: '张三',
  age: 21,
  weight: 80,
  height: 160
}

// 接口类型  interface

interface person {
  name: string
  gender: string
}
let person: person = {
  name: '张三',
  gender: '未知',
}

interface person1 {
  age: number
}
// 接口继承
interface total extends person, person1 { }

const s1: total = {
  name: '张三',
  age: 19,
  gender: '男'
}

// tuple 元组类型  限定数组的固定类型和数据长度

let pos: [number, number] = [39.5427, 116.2317]

// 类型推论  没有指出类型的地方 ts帮助提供类型

let total: number = 12
let total1 = 12


// 字面量类型  

let str1 = '111';
const str2 = '1111'
// const声明的变量 不能修改 ,ts把它当作一个类型
// 配合联合类型使用
// 把常量当作类型来用

// type Direction = '上' | '下' | '左' | '右';
function changeDirection(direction: Direction) {
  console.log(direction);
}
// changeDirection("上")

//枚举 enum

enum Direction {
  top,
  down,
  left,
  right
}
changeDirection(Direction.left)

// any类型 不推荐使用

let string1: any
string1 = 1;
string1 = "1";
string1 = true
string1 = [1, 2, 3]
string1 = {
  key: 1
}


// 泛型  

// 函数泛型

function getVal<Type>(val: Type) {
  return val
}
let res = getVal<number>(123)
let res1 = getVal<string>('abc')


// 泛型接口

interface keyValue<K, V> {
  key: K;
  value: V;
}

interface result<T> {
  code:number,
  data:T,
  msg:string
}

let pair: keyValue<string, number> = {
  key: "key",
  value: 666
};
console.log(pair); // 输出: { key: 'key', value: 666 }



